//
//  HPOAuthViewController.swift
//  MyWeibo
//
//  Created by Apeng on 16/4/10.
//  Copyright © 2016年 Apengpeng. All rights reserved.
//

import UIKit
import SVProgressHUD


class HPOAuthViewController: UIViewController {

    
    let webView = UIWebView()
    
    // 替换根视图
    override func loadView() {
        view = webView
        webView.delegate = self
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setWebViewNavBar()
        
        loadOAthData()
    }
    
    
    // 加载授权页面
    private func loadOAthData() {
        
        // 使用授权的参数拼接url
        let urlStr = "https://api.weibo.com/oauth2/authorize?" + "client_id=" + client_id + "&redirect_uri=" + redirect_uri
        let url = NSURL(string: urlStr)
        let request = NSURLRequest(URL: url!)
        webView.loadRequest(request)
        
    }
    
    
    // setWebViewNavBar
    private func setWebViewNavBar() {
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "关闭", target: self, action: "close")
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", target: self, action: "autoFillData")
    }
    
    // 按钮的点击事件
    @objc private func close() {
        
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    @objc private func autoFillData() {
    webView.stringByEvaluatingJavaScriptFromString("document.getElementById('userId').value = 'leiggee@126.com', document.getElementById('passwd').value = 'oyonomg' ")
        
    }
}
    
    
// 遵守协议
extension HPOAuthViewController: UIWebViewDelegate {
    //MARK: webView 代理方法
    func webViewDidStartLoad(webView: UIWebView) {
        
        // 开启指示器
        SVProgressHUD.show()
    }
    
    func webViewDidFinishLoad(webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    
    
    // 请求授权 获取code , 一但成功, 说明授权成功
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let urlS = request.URL?.absoluteString ?? ""
        // 获取字符串中的code
        let flag = "code="
        if urlS.containsString(flag) {
            // 授权成功
            let range = urlS.rangeOfString(flag)!
            let code = urlS.substringFromIndex(range.endIndex)
            print("code =",code)
            
            // 获取accessToken

//            return false
//            getAccessTokenByCode(code) 通过单例来调用函数
            HPUserAccountViewModel.sharedUserAccountViewModel.getAccessTokenByCode(code, finished: { (isSuccess) -> () in
                
                if !isSuccess {
                    //登录失败
                    SVProgressHUD.showErrorWithStatus("登录失败")
                    return
                }
                SVProgressHUD.showWithStatus("登录成功")
            })
            
            return false

        }
        
        print("授权后的字符串",urlS)
        //为了授权成功后不在加载webView 的数据而是显示APP 的数据返回false
        return true
    }
    
/*
    //MARK: 使用code 获取accessToken
    //    返回的字段为:
    //    uid	string	授权用户的uid。
    //    appkey	string	access_token所属的应用appkey。
    //    scope	string	用户授权的scope权限。
    //    create_at	string	access_token的创建时间，从1970年到创建时间的秒数。
    //    expire_in
    private func getAccessTokenByCode(code: String) {
        // 根据微博的API 文档获取获取accessToken
            let accessTokenURLStr = "https://api.weibo.com/oauth2/access_token"
        // API要求的参数
            let parameters = ["client_id":client_id, "client_secret":client_secret, "grant_type": "authorization_code", "code":code, "redirect_uri":redirect_uri]
            // 发送网络请求 API 要求是POST请求
            HPNetworkingTools.sharedTools.request(.POST, urlStr: accessTokenURLStr, parameters: parameters) { (result, error) -> () in
                
                if error != nil {
                    print("错误", error)
                    SVProgressHUD.showErrorWithStatus("登陆失败")
                    return
                }
    
                // 成功时
                print("授权成功",result)
                
                // 获取用户的信息,(从result 中转换的数据模型)
                self.loadUserInfo(result!)
        }
    }
    
    // 主要获取token 和uid
    private func loadUserInfo(tokenResult: AnyObject) {
    
        // 尝试将结果中的字典转换为模型
        guard let dict = tokenResult as? [String:AnyObject] else {
            SVProgressHUD.showErrorWithStatus("数据结构错误")
            return
        }
        
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 设置参数
        let parameters = ["access_token":token, "uid":uid]
        //发送网络请求
        HPNetworkingTools.sharedTools.request(.GET, urlStr: urlString, parameters: parameters) { (result, error) -> () in
            // 网络请求失败
            if error != nil {
                SVProgressHUD.showErrorWithStatus(netWorkError)
                print("reason", error)
                return
            }
            
            // 网络请求成功
            guard var userInfoDict = result as? [String:AnyObject] else {
                
                // 字典转模型失败https://api.weibo.com/2/users/show.json
                SVProgressHUD.showErrorWithStatus("字典转模型失败")
                return
            }
            
            // 合并字典
            for (key, value) in dict {
                
                userInfoDict[key] = value
            }
            
//             保存完整的字典到沙盒
            let userDefaults = NSUserDefaults.standardUserDefaults()
            // 将字典转为模型

            let userAccount = HPUserAccount(dict: userInfoDict)
            // 获取模型中的信息
            let keys = ["access_token","avatar_large","name","expires_in","uid"]
            let accountDict = userAccount.dictionaryWithValuesForKeys(keys)
            userDefaults.setObject(accountDict, forKey: "userifonKey")
            userDefaults.synchronize()
            
        }
    }

                SVProgressHUD.showErrorWithStatus("登陆成功")
                // 成功时
                print("授权成功",result)
                
              // 获取用户的信息,结果包含在result 中
                self.getUserInfo(result!)
        }
    }
    
    
    // 获取用户的信息 使用用户接口API文档 GET请求,返回JSON
    //使用的URL: https://api.weibo.com/2/users/show.json
    // 请求参数:access_token  必选参数  uid , screen_name 两者选其一
    // 返回的字段: 用户的基本信息(包含很多)
    
    private func getUserInfo(tokenResult: AnyObject) {
        
        // 将返回的JSON格式数据 转为字典
        guard let dict = tokenResult as? [String:AnyObject] else {
            
            SVProgressHUD.showErrorWithStatus("反序列化时出现错误")
            return
        }
        
        // 反序列化成功后
        //通过accessToken 拿到token 的值, 强制解包安全
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        
        // 获取用户信息的URL
        let useInfoURLStr = "https://api.weibo.com/2/users/show.json"
        // 请求参数
        let paratemers = ["access_token":token, "uid":uid]
        // 发送获取用户信息的网络请求
        HPNetworkingTools.sharedTools.request(.GET, urlStr: useInfoURLStr, parameters: paratemers) { (result, error) -> () in
            
            if error != nil {
                print("reson", error)
                SVProgressHUD.showErrorWithStatus("网络请求发生错误")
                return
            }
            
            print("getUserInfoSuccessed!")
            // 将返回的有用的数据反序列化为字典, 因为是text/plain格式, AFN不会自动转化
            guard var userInfoDict = result as? [String:AnyObject] else {
                SVProgressHUD.showErrorWithStatus("反序列化时出现错误")
                return
            }
            
            //为了用户体验, 需要把获取的某些参数保存到沙河中去, 以上两个字典中都有有用的数据, 需要合并
            // 遍历键值少的字典
            for (key, value) in dict {
                //写入可变字典中去
                userInfoDict[key] = value
            }
        // 将保存的字典转模型
            let userAccount = HPUserAccount(dict: userInfoDict)
            //获取字典指定key的信息
            let keys = ["access_token","avatar_large","name","expires_in","uid"]
            // 根据模型对象的key值获取字典信息
            let userAccountInfoDict = userAccount.dictionaryWithValuesForKeys(keys)
            
            // 保存模型到沙盒
            let userDefaults = NSUserDefaults.standardUserDefaults()
            userDefaults.setObject(userAccountInfoDict, forKey: "userAccountInfoDict")
            //同步
            userDefaults.synchronize()
            
        }
        
    }
*/
    
}

